package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import mx.ipn.to.EconomicoTO;
import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PersonaDAO;
import mx.ipn.persistencia.dao.EconomicoDAO;
import mx.ipn.to.PersonaTO;

public class EconomicoDAOMySQL implements EconomicoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(EconomicoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO economico (id_persona,activo) VALUES(?,?)";
	private static final String DESACTIVA = "UPDATE economico SET activo=false WHERE id_economico=?";
	private static final String UPDATE = "UPDATE economico SET id_persona=?,activo=? WHERE id_economico=?";
	private static final String FINDBYID = "SELECT * FROM economico WHERE id_economico=?";
	private static final String SELECT = "SELECT * FROM economico";
	private static final String SELECTACTIVO = "SELECT * FROM economico WHERE activo=true";
	private static final String SELECTBYPERSONA = "SELECT * FROM economico WHERE id_persona=?";
	private static final String SELECTACTIVOBYPERSONA = "SELECT * FROM economico WHERE activo=true AND id_persona=?";
	FabricaDeDAOs fabricaMySQL;

	@Override
	public EconomicoTO findEconomicoById(int idEconomico) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idEconomico);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();
			if (rs.next()) {
				idEconomico = rs.getInt("id_economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				EconomicoTO EconomicoTO = new EconomicoTO(idEconomico,
						personaTO, activo);
				ps.close();
				conexion.close();
				return EconomicoTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertEconomico(EconomicoTO EconomicoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, EconomicoTO.getPersonaTO().getIdPersona());
			ps.setBoolean(2, EconomicoTO.getActivo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<EconomicoTO> selectEconomico() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();
			ArrayList<EconomicoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<EconomicoTO>();

				int idEconomico = rs.getInt("id_Economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				EconomicoTO EconomicoTO = new EconomicoTO(idEconomico,
						personaTO, activo);
				coleccion.add(EconomicoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<EconomicoTO> selectEconomicoActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();
			ArrayList<EconomicoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<EconomicoTO>();

				int idEconomico = rs.getShort("id_Economico");
				boolean activo = rs.getBoolean("activo");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				EconomicoTO EconomicoTO = new EconomicoTO(idEconomico,
						personaTO, activo);
				coleccion.add(EconomicoTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateEconomico(EconomicoTO economicoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, economicoTO.getPersonaTO().getIdPersona());
			ps.setBoolean(2, economicoTO.getActivo());
			ps.setInt(3, economicoTO.getIdEconomico());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public short DesActivaEconomico(int idEconomico) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DESACTIVA);

			ps.setInt(1, idEconomico);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public EconomicoTO selectEconomicoActivoByPersona(int idPersona) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla persona
			PersonaDAO personaDAO = null;

			ArrayList<Integer> listIdEconomico = null;
			ArrayList<Boolean> listActivo = null;

			EconomicoTO economicoTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYPERSONA);
			ps.setInt(1, idPersona);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdEconomico == null) {

					listIdEconomico = new ArrayList<Integer>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					personaDAO = fabricaMySQL.getPersonaDAO();
				}

				listIdEconomico.add(rs.getInt("id_economico"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdEconomico != null) {
				PersonaTO personaTO = personaDAO.findPersonaById(idPersona);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdEconomico = (Integer[])listIdEconomico.toArray(new Integer[listIdEconomico.size()]);
				
				economicoTO = new EconomicoTO(arrIdEconomico, personaTO,
						arrActivo);
			}
			ps.close();
			conexion.close();
			return economicoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public EconomicoTO selectEconomicoByPersona(int idPersona) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla persona
			PersonaDAO personaDAO = null;

			ArrayList<Integer> listIdEconomico = null;
			ArrayList<Boolean> listActivo = null;

			EconomicoTO economicoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPERSONA);
			ps.setInt(1, idPersona);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdEconomico == null) {

					listIdEconomico = new ArrayList<Integer>();
					listActivo = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					personaDAO = fabricaMySQL.getPersonaDAO();
				}

				listIdEconomico.add(rs.getInt("id_economico"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdEconomico != null) {
				PersonaTO personaTO = personaDAO.findPersonaById(idPersona);
				
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdEconomico = (Integer[])listIdEconomico.toArray(new Integer[listIdEconomico.size()]);
				
				economicoTO = new EconomicoTO(arrIdEconomico, personaTO, arrActivo);
			}
			ps.close();
			conexion.close();
			return economicoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
